7.11 数据透视表的聚合处理
Excel中有透视表工具,在Pandas中同样也提供了一个电子表格样式的数据透视表函数,pivot_table()函数的功能也有强大的数据汇总能力,该函数有pd.pivot_table()和df.pivot_table()两种形式,区别在于pd.pivot_table()函数需要在函数中提供data参数,也就是数据源,而df.pivot_table()函数中的df已提供了数据源,所以不数提供,结构如下:
pd.pivot_table(data,values=None,index=None,columns=None,aggfunc=”mean”,fill_value=None,margins=False,drona=True,margins=”All”,observed=False)
data:提供数据源
values:提供要汇总的列名,如果是多列名,则写在列表中;
index:在数据透视表行索引上进行分组的列名,如果是多个列名则写在列表中,如果传递数组,则其长度必须与data参数提供的表格数据长度相同,该列表可以包含任何其他类型(列表除外)
columns:在数据透视表索引上进行分组的列名,该参数特性与index相同
aggfunc:提供做聚合的方式,可以是函数、列表、字典,默认为numpy.mean(平均)
fill_value:替换缺失值的值(数据透视表缺失值的处理)
margins:添加所有行/列,例如,小计/总计
dropna:将所有条目为NaN的列删除
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.11 数据透视表的聚合处理.xlsx" )
print (df)
t=df.pivot_table(
values=[ "语文","数学" ],
index=[ "班级","贯籍" ],
aggfunc=[ "sum","mean" ]
)
print (t)
返回:
班级 | 贯籍 | 姓名 | 语文 | 数学 | |
---|---|---|---|---|---|
0 | 1班 | 广东 | 张三 | 90 | 83 |
1 | 1班 | 广东 | 李四 | 100 | 87 |
2 | 1班 | 广东 | 王五 | 95 | 88 |
3 | 2班 | 湖南 | 郭流子 | 81 | 97 |
4 | 1班 | 湖南 | 许麻子 | 92 | 89 |
5 | 2班 | 湖南 | 宋狗子 | 89 | 88 |
6 | 2班 | 广东 | 小曾 | 84 | 84 |
7 | 2班 | 广东 | 韦大宝 | 87 | 94 |
sum | mean | ||||
---|---|---|---|---|---|
数学 | 语文 | 数学 | 语文 | ||
班级 | 贯籍 | ||||
1班 | 广东 | 258 | 285 | 86.0 | 95.0 |
湖南 | 89 | 92 | 89.0 | 92.0 | |
2班 | 广东 | 178 | 171 | 89.0 | 85.5 |
湖南 | 185 | 170 | 92.5 | 85.0 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.11 数据透视表的聚合处理1.xlsx" )
print (df)
t=df.pivot_table(
values= "收入" ,
columns=df.财务日期.dt.month,
index= "产品大类" ,
aggfunc= "sum" ,
fill_value= "0"
)
print (t)
返回:
物料编号 | 数量 | 财务日期 | 收入 | 产品大类 | 细分市场 | |
---|---|---|---|---|---|---|
0 | 1-1364844-8 | 2000 | 2024-01-08 | 412.00 | 电子连接器 | 数据通信 |
1 | 1-1364844-8 | 4000 | 2024-01-08 | 824.00 | 电子连接器 | 数据通信 |
2 | 1202-642-P9-2 | 60 | 2024-01-08 | 844.80 | 电子连接器 | 医疗&其他 |
... | ... | ... | ... | ... | ... | ... |
9289 | 1364843-6 | 2800 | 2024-02-29 | 616.00 | 电子连接器 | 数据通信 |
9290 | 80-0012-6784-0 | 1000 | 2024-02-21 | 12373.18 | M线缆 | 工业控制 |
9291 | 80-0013-8735-8 | 72000 | 2024-02-27 | 18927.43 | M连接器 | 工业控制 |
[9292 rows x 6 columns]
财务日期 | 1 | 2 |
---|---|---|
产品大类 | ||
M线缆 | 1156561.33 | 189673.57 |
M连接器 | 557808.14 | 496924.54 |
半成品 | 147123.37 | 138743.04 |
原材料 | 24793.28 | 0 |
电子连接器 | 19194487.02 | 15702944.41 |
连接组件 | 83027.32 | 112958.34 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.11 数据透视表的聚合处理1.xlsx")
print (df)
t=df.pivot_table(
values= "收入" ,
# columns=df.财务日期.dt.month, # 经过处理的日期是不可能的
columns= "细分市场" ,
index= "产品大类" ,
aggfunc= "sum" ,
fill_value= "0" ,
margins =True,
margins_name= "总计"
)
print (t)
返回:
细分市场 | 医疗&其他 | 工业控制 | 数据通信 | 新能源 | 总计 |
---|---|---|---|---|---|
产品大类 | |||||
M线缆 | 482636.69 | 662334.05 | 201264.16 | 0 | 1346234.9 |
M连接器 | 0 | 675783.0 | 378949.68 | 0 | 1054732.68 |
半成品 | 4035.41 | 89025.64 | 1190.0 | 191615.36 | 285866.41 |
原材料 | 23689.27 | 1104.01 | 0 | 0 | 24793.28 |
电子连接器 | 2713767.1 | 4037807.44 | 26403422.87 | 1742434.02 | 34897431.43 |
连接组件 | 10485.6 | 111142.91 | 74357.15 | 0 | 195985.66 |
总计 | 3234614.07 | 5577197.05 | 27059183.86 | 1934049.38 | 37805044.36 |